前幾篇提到了IoT Device怎麼註冊到IoT Hub的方法,但好像都沒有提到如果透過IoT Hub控制IoT Device該如何實作,方法其實也有許多種,比如說: 直接方法、IoT Hub Twins...等等,那今天會使用IoT Hub Twins的方法來實作控制,我們繼續看下去吧!
準備
裝置 twins是儲存裝置狀態資訊的 JSON 檔,包括中繼資料、設定和條件。 Azure IoT 中樞會維持連線到 IoT 中樞的每部裝置其裝置對應項。
簡單來說就是你的裝置在雲端上也有一個分身在上面,然後兩個透過連線的方式,持續的更新JSON的內容達到控制的效果!
附上一個微軟的IoT Hub Twins圖
裝置端: 讀取Desired(需要) -> 寫入Report(報告)
應用程式端: 讀取Report(報告) -> 寫入Desired(需要)
這次會簡單的實作上面的架構以達到可以控制裝置的應用程式
如果有實作前幾篇,可以跳過本節
到Azure Portal搜尋IoT 中樞,並且新增
基本
網路功能
大小與級別
建立
到IoT Hub的IoT裝置,並且點擊新增
輸入裝置ID後,按下儲存
到裝置詳細資料後,在主要連接字串按下複製
到共用存取原則,按下新增
新增一個規則
複製連接字串 - 主要金鑰
先安裝依賴
pip install azure-iot-hub
pip install azure-iot-device
新增後端程式
backend.py
import sys
from azure.iot.hub import IoTHubRegistryManager
from azure.iot.hub.models import Twin, TwinProperties
IOTHUB_CONNECTION_STRING = "{your-iot-hut-connectionString}"
DEVICE_ID = "python-device"
def iot_update():
try:
iothub_registry_manager = IoTHubRegistryManager(IOTHUB_CONNECTION_STRING)
twin = iothub_registry_manager.get_twin(DEVICE_ID)
twin_patch = Twin(properties= TwinProperties(desired={'power' : 'false'}))
twin = iothub_registry_manager.update_twin(DEVICE_ID, twin_patch, twin.etag)
print("Okay!")
except Exception as ex:
print("Unexpected error {0}".format(ex))
return
except KeyboardInterrupt:
print("IoT Hub Device Twin service sample stopped")
if __name__ == '__main__':
iot_update()
新增裝置應用程式
device.py
import time
import threading
from azure.iot.device import IoTHubModuleClient
CONNECTION_STRING = "{your-device-connectionString}"
def twin_update_listener(client):
while True:
patch = client.receive_twin_desired_properties_patch()
print("Twin patch received:")
print(patch)
if(patch['power'] == false):
print('I\'m shutdown now!)
def iothub_client_init():
client = IoTHubModuleClient.create_from_connection_string(CONNECTION_STRING)
return client
def iothub_client_sample_run():
try:
client = iothub_client_init()
twin_update_listener(client)
except KeyboardInterrupt:
print ( "IoT Hub Device Twin device sample stopped" )
if __name__ == '__main__':
print ( "Starting the Python IoT Hub Device Twin device sample..." )
iothub_client_sample_run()
執行應用程式
python3 device.py
python3 backend.py
device: 會有一個blocking的地方會等待desired更新
backend: 會傳送一個desire的參數
完成之後device.py會輸出下面的訊息
$ python3 device.py
Starting the Python IoT Hub Device Twin device sample...
Twin patch received:
{'power': 'false', '$version': 11}
透過上面的方法就可以控制Device的所有控制項了,除了Desire之外,也可以透過Report傳送目前裝置的狀態,比如說開關機、其他Sensor的狀態...等等,但實際應用上會有許多問題需要注意!!